#ifndef __P_API_H
#define __P_API_H

#include <glib.h>

// TODO (R.U.S.H.A.N.#1#): Перевести строковый тип char в wchar_t

// Default connect parameters
// -----------------------------------
//#define P_DEFAULT_SERVER_HOST         "login.chatty.ru"
#define P_DEFAULT_SERVER_HOST		    "127.0.0.1"
#define P_DEFAULT_SERVER_PORT           3107

// Protocol ID's
// -----------------------------------
#define PROTOCOL_OSCAR				    0x00000001	// ICQ
#define PROTOCOL_XMPP 				    0x00000002	// XMPP
#define PROTOCOL_MRIM				    0x00000003	// Mail.ru Agent

#define PROTOCOL_VER				    0x10000000	// 1.0

// Status values (used to set own status)
// -----------------------------------
#define P_STATUS_OFFLINE				0x00000000 // Supported in ICQ, XMPP, MRIM, VK
#define P_STATUS_ONLINE					0x00000001 // Supported in ICQ, XMPP, MRIM, VK
#define P_STATUS_FFC					0x00000002 // Supported in ICQ, XMPP, MRIM,
#define P_STATUS_AWAY					0x00000003 // Supported in ICQ, XMPP,
#define P_STATUS_DND					0x00000004 // Supported in ICQ, XMPP,
#define P_STATUS_NA						0x00000005 // Supported in ICQ, XMPP,
#define P_STATUS_EVIL       			0x00000006 // Supported in ICQ,
#define P_STATUS_DEPRESSION 			0x00000007 // Supported in ICQ,
#define P_STATUS_HOME      				0x00000008 // Supported in ICQ,
#define P_STATUS_WORK       			0x00000009 // Supported in ICQ,
#define P_STATUS_LUNCH      			0x0000000A // Supported in ICQ,
#define P_STATUS_INVISIBLE				0x0000000B // Supported in ICQ, XMPP, MRIM,

#define P_STATUS_ALL_CAN_SEE			0x00001000 // Supported in ICQ	// Видимый для всех
#define P_STATUS_VISLIST_CAN_SEE		0x00002000 // Supported in ICQ	// Видимый только для списка видящих
#define P_STATUS_INVISLIST_CANNOT_SEE	0x00003000 // Supported in ICQ	// Видимый для всех, кроме списка невидящих
#define P_STATUS_CONTACTLIST_CAN_SEE	0x00004000 // Supported in ICQ	// Видимый только для списка контактов
#define P_STATUS_NOBODY_CAN_SEE			0x00005000 // Supported in ICQ	// Невидимый для всех

// Коды ошибок для P_ERROR::subtype
// -----------------------------------
#define ERROR_BAD_PACKET			0x00000001 // Кривой пакет
#define ERROR_INVALID_PROTOCOL		0x00001000 // Не правильный индефикатор протокола, или он не потдерживается
#define ERROR_INVALID_PROTOCOL_VER	0x00001001 // Версия протокола клиента не потдерживается сервером
#define ERROR_USER_KICKED			0x00001002 //
#define	ERROR_REMOTE_SERVER			0x00002000 // Ошибка удаленного сервера (ICQ, XMPP или MRIM)
#define	ERROR_DOUBLE_LOGIN			0x00002001 // Двойной вход с учетной записи, Only ICQ & MRIM.
#define	ERROR_RATE_LIMIT_EXCEEDED	0x00002002 // Превышен лимит переподключений
#define ERROR_BAD_LOGIN_PW			0x00003000 // Неправильный логин или пароль
#define ERROR_UNKNOWN				0x0000FFFF // В PACKET_T::data - текст ошибки 

// Коды серверных сообщений PACKET_T::subtype
// -----------------------------------
#define SRV_MSG_YOU_WERE_ADDED		0x00000001 // Вас добавили
#define SRV_MSG_AUTH_RESPONSE		0x00000002 //	if ( PACKET_T::data[0] == (DWORD)0x00000000 )
												//		Запрос авторизации отклонили
												//	else if ( PACKET_T::data[0] == (DWORD)0x00000001 )
												//		Вас авторизовали


// Константы операций (взаимодействие с сервером шлюза)
// -----------------------------------
#define P_SERVER_STATISTICS			0x00000001	// C > S or S > C	// Запрос или ответ на запрос статистики сервера 

#define P_ERROR 					0x00001000	// S > C			// В PACKET_T::subtype код ошибки.
#define P_PING						0x00001001	// C > S

// Порядок авторизации на сервере
#define P_LOGIN_HELLO 				0x00002000	// S > C			// Пакет приветствия
																	// if (PACKET_T::data != 0 )
																	// то пришел (char*)ip;port переподключаемся и шлем P_LOGIN
#define P_LOGIN 					0x00002001	// C > S			// Авторизация на сервере, отправляем серверу PACKET_LOGIN_PARAMS_T
#define P_LOGIN_OK 					0x00002002	// S > C			// Авторизация прошла успешна, empty
#define P_LOGOUT					0x00002003	// C > S or S > C	// Дисконнект, empty
// Сообщения
// PACKET_T::subtype - тип сообщения
// PACKET_T::data[0...3] - id
// PACKET_T::data[4....] - текст
#define P_MESSAGE					0x00003000	// C > S or S > C	// Исходящее или входящее сообщение

#define P_MSG_SEND_URL				0x00003001	// C > S or S > C	// Отправить ссылку
// Отчет о доставкке
// PACKET_T::subtype - id сообщения
#define P_MSG_DELIVERY				0x00003002	// S > C or S > C	// Сервер получил сообщение

// Оповещение о наборе
#define P_TYPING_NTF_START 			0x00004000	// C > S or S > C 	// Исходящее или входящее оповещение о начале наборе текста
#define P_TYPING_NTF_DONE 			0x00004001	// C > S or S > C	// Исходящее или входящее оповещение о конце набора текста
// Статусы
#define P_STATUS_CHECK 				0x00005000	// C > S 			// Проверить статус пользователя

// PACKET_T::subtype - id статуса
// PACKET_T::data - текст
#define P_STATUS_CHANGE 			0x00005001	// C > S or S > C	// Пользователь сменил статус
#define P_XSTATUS_CHANGE 			0x00005002	// C > S or S > C	// Пользователь сменил x-статус
#define P_XTEXT_REQ 				0x00005003	// C > S or S > C 	// Я или у меня запрашивают x-статус
#define P_XTEXT_REQ_ANSWER	 		0x00005004	// C > S			// Ответ на запрос x-статуса
// Управравление подпиской
#define P_AUTH_REQ 					0x00006000	// C > S or S > C	// Отправлен или пришел запрос на авторизацию
																	// 		В PACKET_T::data текст запроса
#define P_AUTH_SET 					0x00006001	// C > S or S > C	// Ответ на запрос на авторизации
																	// 		PACKET_T::subtype = 0x00000001 - принять
																	// 		PACKET_T::subtype = 0x00000000 - отклонить
// Контакт лист
#define P_ROSTER 					0x00007000	// S > C			// Контакт лист
// Vcard
#define P_USER_INFO		 			0x00008000	// C > S or S > C	// Отправлен или пришел запрос информации о контакте
#define P_USER_INFO_SET 			0x00008001	// C > S			// Установить информацию о контакте
#define P_AVATAR					0x00008002  // C > S or S > C	// Запрос аватары
// Информация о клиенте
// PACKET_T::subtype - id клиента
// PACKET_T::data - инфа
#define P_VERSION	 				0x00009000	// C > S or S > C	// Запросить информацию о клиенте или ответ на запрос

// Управление контакт листом
#define P_CONTACT_ADD 				0x0000A000	// C > S			// Добавить контакт.
																	// 		В PACKET_T::data должно быть название группы
#define P_CONTACT_REMOVE 			0x0000A001	// C > S			// Удалить контакт
#define P_CONTACT_REMOVE_ME 		0x0000A002	// C > S			// Удалится из его контакт листа
#define P_CONTACT_MOVE 				0x0000A003	// C > S			// Переместить контакт
																	// 		В PACKET_T::data должно быть название группы 16 байт
#define P_CONTACT_RENAME 			0x0000A004	// C > S			// Переименовать контакт
																	// 		В PACKET_T::data должен быть новый ник, 32 байта
#define P_CONTACT_REMOVED 			0x0000A005	// S > C			// Контакт удалился из моего контакт листа
// Управление группами
#define P_GROUP_ADD 				0x0000A006	// C > S			// Добавить группу
#define P_GROUP_RENAME 				0x0000A007	// C > S			// Переименовать группу
																	// (char*)PACKET_T::data Исходное имя группы  16 байт
																	// (char*)PACKET_T::data+16 Новое имя группы  16 байт
#define P_GROUP_REMOVE 				0x0000A008	// C > S			// Удалить группу
																	// PACKET_T::data Имя группы  16 байт
#define P_SEARCH 					0x0000B000	// C > S or S > C

#define P_SERVER_MESSAGE			0x0000C000	// S > C			// Серверные сообщения
																	//		В PACKET_T::subtype код сообщеиня

// @PACKET_HEADER_T::magic
//#define P_MAGIC     				0x01DA1EF9	// Клиентский Magic ( C <-> S )

// @P_LOGIN::params
#define P_SUPPORT_DELIVERY			0x00000001	// Потдержка отчета о доставке
#define P_SUPPORT_TYPING			0x00000002	// Потдержка оповещения о наборе
#define P_SUPPORT_XSTATUS			0x00000004	// Потдержка x-статусов
#define P_NEED_ROSTER				0x10000000	// При наличие этого параметра сервер вышлет список контактов

// @P_AVATAR
// @P_PACKET::subtype
#define P_AVATAR_TYPE_SMALL			0x00000001	// 24x24 px
#define P_AVATAR_TYPE_BIG			0x00000002	// Исходный рамер

// @PACKET_CONTACT_T::type
#define P_CONTACT_TYPE_DEF			0x00000000 // Обычный контакт
#define P_CONTACT_TYPE_PHONE		0x00000001 // Телефонный номер (only MRIM)
#define P_CONTACT_TYPE_CHAT			0x00000002 // Конференция или мультичат

// @PACKET_SEARCH_T::flags
#define P_SEARCH_ONLY_ONLINE		0x00000001 // Искать только онлайн контакты

// Загаловок пакета
typedef struct
{
	guint32 		type;			// 4  // 0  // Тип пакета
	guint32			subtype;		// 4  // 4
	char 			login[48];		// 48 // 8  // Кому или от кого, UIN, JID or Email
	guint32			dlen;			// 4  // 56 // Размер данных
									// 60 байт
} PACKET_HEADER_T;

// S > C
// @P_LOGIN_HELLO
typedef struct
{
    char			ip[16];		// Версия протокола
	guint32			port;	

} PACKET_IP_PORT_T;

// S > C
// @P_SERVER_STATISTICS
// Статистика сервера
typedef struct
{
	guint32			is_debug;
    guint32         version;		// Версия сервера
	guint32			protocol;		// Версия протокола
	guint32			online_clients;	// Число онлайн клиентов
	
} PACKET_STATISTICS_T;

// C > S
// @P_LOGIN
// Параметры для входа
typedef struct
{
	guint32 		protocol_id;		// ID протокола
	guint32			protocol_ver;		// Версия протокола
	guint32			params;				// Параметры подключения
	char    		login[48];			// UIN, JID or Email
 	char    		pass[24];			// Пароль, в будущем хэш.
	char    		host[16];			// Хост, если равен нулю, то сервер подключается к хосту по умолчанию
    guint32         status;				// Обычный статус
    char            status_msg[32];		// Статустное сообщение
    guint32         xstatus;			// Расширенный статус
    char            xstatus_msg[256];	// Xtraz-сообщение
	char			tz[4];				// Часовой пояс

    char            client_caps[256];	// Внутренне название 	// chatty или http://chatty.ru/caps
    char            client_name[32];	// Название				// Chatty IM
	char            client_ver[32];		// Версия 			  	// 0.0.1
    char            client_build[16];	// Билд					// 125
    char            client_os[32];		// Операционная система // J2ME
	char			phone_model[32]; 	// Модель телефона		// Motorola E398

} PACKET_LOGIN_PARAMS_T;

// C > S or S > C
// @P_STATUS_CHANGE
// @P_XSTATUS_CHANGE
// Статусы
// PACKET_T::data char 			text[256];		// Статусное сообщение - не обезательный параметр, может отсутсвовать

// S > C
// @P_VERSION
// Информация о клиенте
// if ( packet->dlen == 256 ) {
//		в пакете содежится только id клиента // ( это сделано для экономии трафика )
// }
typedef struct
{
	char			caps[256];		// Индификатор. Например для XMPP: http://2010.qip.ru/caps
	char            name[32];		// Название
	char 			version[32];	// Версия
	char            build[16];		// Сборка
	char 			os[32];			// Опереционная система
	char			phone_model[32];// Модель телефона
} PACKET_CLIENT_INFO_T;

// S > C
// @P_USER_INFO
// @P_USER_INFO_SET
// Информация о контакте
typedef struct
{
    char			nick[32];		// Псевдоним
    char			email[32];		// Электронная почта
    char			first_name[32];	// Имя
    char			last_name[32];	// Фамилия
	char			birthday[16];	// День рождения
	guint32			gender;			// Пол
    char			home_city[32];	// Город
    char			home_state[32]; // Регион(область)
	char			home_page[128]; // Домашняя страничка
    char		 	home_phones[32];// Домашний телефон
    char			home_fax[32];	// Факс
    char			home_address[256];
	char			home_tz[4];		// Часовой пояс

    char			cell_phone[32];	// Сотовый

    char			interests[512]; // Интересы
    char			about[512];		// О себе

    char			work_city[32];
    char			work_state[32];
    char			work_phone[32];
    char			work_fax[32];
    char			work_address[256];
    char			work_company[32];
    char			work_department[32];
    char			work_position[32];
	char			work_webpage[128];

} PACKET_VCARD_T;

// S > C
// Контакт лист приходит на запрос P_ROSTER.
// В PACKET_T::data содержитмя массив из элементов с типом PACKET_CONTACT_T и
// количесвом PACKET_T::dlen/sizeof(PACKET_CONTACT_T)
typedef struct
{
	char			login[48];		// UIN, JID, Email or VkID
	char			nick[32];		// Псевдоним
    char 			group[16];		// Группа контакта
	guint32			type;			// Тип
	guint32			need_auth;		
	guint32			status;			// Статус
	
} PACKET_CONTACT_T;

// C > S
// @P_SEARCH
// Поиск контакта
typedef struct
{
	char			login[48];		// UIN, JID, Email
	char			email[32];
    char 			nick[32];		// Псевдоним
	char 			first_name[32];	// Имя
	char 			last_name[32];	// Фамилия
	char 			city[32];		// Город
	char 			date1[4];       // Минимальный возраст (в годах)
    char 			date2[4];       // Максимальный возраст (в годах)
	guint32			gender;			// Пол 0 - любой, 1 - жен, 2 - муж
	guint32			flags;

} PACKET_SEARCH_T;

#endif	 // __P_API_H
